package com.qire.manhua.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import com.qire.common.basic.ObjectUtil;
import com.qire.manhua.R;
import com.qire.manhua.view.linkageBehaviors.CoordinatorWrapper;
import com.qire.manhua.view.refresh.SeesawAnimationDropHeader;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;

/**
 * 协调ViewPager
 */
public class CoordinatorViewPager extends ViewPager implements CoordinatorWrapper {

    private static final int INVALID_ID = -1;
    private static final int TAG_LAST_SCROLL_Y = 5 << 24;

    private final int coordinatorHeaderId;
    private final int coordinatorLayoutId;

    private CoordinatorHeaderListener headerListener;
    private CoordinatorLayoutListener layoutListener;

    // 控制滑动拦截
    private boolean isCanScroll = true;

    public CoordinatorViewPager(@NonNull Context context) {
        this(context, null);
    }

    public CoordinatorViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CoordinatorViewPager);
        if (typedArray.hasValue(R.styleable.CoordinatorViewPager_coordinator_layoutId)) {
            this.coordinatorLayoutId = typedArray.getResourceId(R.styleable.CoordinatorViewPager_coordinator_layoutId, INVALID_ID);
        } else {
            this.coordinatorLayoutId = INVALID_ID;
        }
        if (typedArray.hasValue(R.styleable.CoordinatorViewPager_coordinator_headerId)) {
            this.coordinatorHeaderId = typedArray.getResourceId(R.styleable.CoordinatorViewPager_coordinator_headerId, INVALID_ID);
        } else {
            this.coordinatorHeaderId = INVALID_ID;
        }
        typedArray.recycle();
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return this.isCanScroll && super.onTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return this.isCanScroll && super.onInterceptTouchEvent(ev);
    }

    @Override
    public void setCoordinatorHeaderListener(CoordinatorHeaderListener headerListener) {
        this.headerListener = headerListener;
        bindScrollChangeListener();
    }

    @Override
    public void setCoordinatorLayoutListener(CoordinatorLayoutListener layoutListener) {
        this.layoutListener = layoutListener;
        bindScrollChangeListener();
    }

    @Override
    protected void onPageScrolled(int position, float offset, int offsetPixels) {
        super.onPageScrolled(position, offset, offsetPixels);
        // todo: 如果需要练左右滑动渐变也实现，可以考虑在这里在加一个调度监听，来处理页面左右滑动导致的调度栏背景问题。
        if(offsetPixels == 0) {
            bindScrollChangeListener();
        }
    }

    private void bindScrollChangeListener() {
        View childView = getChildAt(getCurrentItem());
        if(ObjectUtil.nonNull(childView)) {
            if (coordinatorHeaderId != INVALID_ID && ObjectUtil.nonNull(headerListener)) {
                SeesawAnimationDropHeader dropHeader = childView.findViewById(coordinatorHeaderId);
                if(ObjectUtil.nonNull(dropHeader)){
                    dropHeader.setOnMovingListener((isDragging, moveOffset) -> {
                        headerListener.onHeaderMoveChanged(this, isDragging, moveOffset);
                        // 如果滑动触发到了下拉头，说明一定是到顶部了，那么在这里做一个重置来修正异常问题带来的偏差
                        childView.setTag(TAG_LAST_SCROLL_Y, 0);
                        // todo 目前猜测是这个原因引起，如果可以找出问题，最好是避免阻拦而是在源头解决问题。
                        // 如果拉出了加载头，必须等待加载头归位才能左右滑动，以避免加载状态下，切换到别的子页导致布局问题。
                        isCanScroll = moveOffset == 0;
                    });
                } else {
                    // 如果没有设置关注的调度头则重置一次事件
                    headerListener.onHeaderMoveChanged(this, false, 0);
                }
            }

            if (coordinatorLayoutId != INVALID_ID && ObjectUtil.nonNull(layoutListener)) {
                View layout = childView.findViewById(coordinatorLayoutId);
                if(ObjectUtil.nonNull(layout)) {
                    layout.setOnScrollChangeListener((View view, int scrollX, int scrollY, int oldScrollX, int oldScrollY) -> {
                        scrollY = ObjectUtil.as(childView.getTag(TAG_LAST_SCROLL_Y), Integer.class, 0);
                        scrollY = scrollY + oldScrollY;
                        layoutListener.onLayoutMoveChanged(this, scrollY);
                        childView.setTag(TAG_LAST_SCROLL_Y, scrollY);
                    });

                    // 当切换页面后默认用当前页的位置刷新一次联动效果
                    layoutListener.onLayoutMoveChanged(this, ObjectUtil.as(childView.getTag(TAG_LAST_SCROLL_Y), Integer.class, 0));
                } else {
                    // 如果没有设置关注的调度布局则重置，这里使用最大值是为了使栏目可以处理非透明背景，可以更具需求来修正
                    layoutListener.onLayoutMoveChanged(this, -Integer.MAX_VALUE);
                }
            }
        }
    }

    /**
     * post方式设置当前选项卡索引，在页面初始化时，可能由于子控件未能完全度量及初始化，可能导致 {@link #bindScrollChangeListener} 方法绑定失败，
     * 故使用post方式来确保时间关联一定成功，当然其他类似情况也可以用次方法代替。
     * @param item 选项卡索引
     */
    public void postCurrentItem(int item) {
        post(() -> setCurrentItem(item));
    }

}
